package org.xlp.db.xml;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * sql配置文件解析责任链接口实现
 */
public class SQLXmlFileHandlerChain implements ISQLXmlFileHandlerChain, ISQLXmlFileHandlerList{
    /**
     * 存储sql文件处理器
     */
    private List<ISQLXmlFileHandler> sqlXmlFileHandlers = new ArrayList<>();

    /**
     * 当前执行处理器下标
     */
    private int index = 0;

    /**
     * 添加处理器
     * @param index 向指定索引添加处理器
     * @param handler 要添加的处理器
     */
    @Override
    public void addHandler(int index, ISQLXmlFileHandler handler){
        if (handler == null) return;
        if (index < 0){
            index = 0;
        } else if (index >= sqlXmlFileHandlers.size()){
            index = sqlXmlFileHandlers.size() - 1;
        }
        sqlXmlFileHandlers.add(index, handler);
    }

    /**
     * 设置存储sql文件处理器
     * @param sqlXmlFileHandlers
     */
    public void setSqlXmlFileHandlers(List<ISQLXmlFileHandler> sqlXmlFileHandlers){
        if (sqlXmlFileHandlers != null){
            this.sqlXmlFileHandlers = sqlXmlFileHandlers;
        }
    }

    /**
     * 添加处理器
     * @param handler 要添加的处理器
     */
    @Override
    public void addHandler(ISQLXmlFileHandler handler){
        sqlXmlFileHandlers.add(handler);
    }

    /**
     * 向头部添加处理器
     * @param handler 要添加的处理器
     */
    @Override
    public void addHandlerToHead(ISQLXmlFileHandler handler){
        sqlXmlFileHandlers.add(0, handler);
    }

    /**
     * 移除指定位置的处理器
     *
     * @param index
     * @throws IllegalAccessException 假如参数不合理，则抛出该异常
     */
    @Override
    public void removeHandler(int index) {
        sqlXmlFileHandlers.remove(index);
    }

    /**
     * 移除指定的sql处理器
     *
     * @param handler
     */
    @Override
    public void removeHandler(ISQLXmlFileHandler handler) {
        sqlXmlFileHandlers.remove(handler);
    }

    /**
     * 移除所有的处理器
     */
    @Override
    public void clearHandler() {
        sqlXmlFileHandlers.clear();
    }

    /**
     * 获取所有的sql处理器
     *
     * @return
     */
    @Override
    public List<ISQLXmlFileHandler> getAllHandlers() {
        return Collections.unmodifiableList(sqlXmlFileHandlers);
    }

    /**
     * 处理sql配置文件，把配置文件信息处理成SQLConfigurationFileInfo对象
     *
     * @param sqlXmlFilePath sql配置文件
     * @return
     * @throws SQLXmlFileParseException 当处理失败时，则抛出该异常
     */
    @Override
    public SQLConfigurationFileInfo handle(String sqlXmlFilePath) throws SQLXmlFileParseException {
        int size = sqlXmlFileHandlers.size();
        if (size > 0 && index < size){
            ISQLXmlFileHandler handler = sqlXmlFileHandlers.get(index);
            //获取下个处理器的索引
            index++;
            if (handler != null){
                return handler.handle(sqlXmlFilePath, this);
            }
        }
        return null;
    }
}
